<template>
	<view class="pagebox flex-column" @click="obj.showMod=false">
		<template>
			<navtop :isnews="obj.isnews"></navtop>
			<view class="bg" @click="$c.go_url('/pages/login')"></view>
			
			<view :class="['bottombox',obj.inputBottom>0?'':'inputBottom']" :style="{bottom: `${obj.inputBottom}px`,'padding-bottom': `${obj.inputBottom>0?10:obj.safeAreaBottom||10}px`}" @click.stop="()=>{}">
				<view class="chartbox flex-row-center">
					<view class="inputbox flex-row-center">
						<textarea v-model="obj.chatMsg" :disabled="obj.isChartEnd==0" auto-height :adjust-position="false" placeholder="请在此输入您要提问的内容" @keyboardheightchange="keyboardheightchange" />
						<view class="addiconbox flex-center" @click="showMod">
							<image class="addicon" src="../../static/6.png" mode="aspectFill"></image>
						</view>
					</view>
					<view v-if="obj.chatMsg" class="send" @click="sendInut(obj.chatMsg)">发送</view>
				</view>
				<template v-if="obj.showMod">
					<view class="modbox flex-row wrap mt30">
						<view class="mod flex-column-center" v-for="(v,i) in obj.mods" :key="i" @click="selectMod(v)">
							<view class="item flex-center"><image class="" :src="`../../static/${v.icon}.png`" mode="widthFix"></image></view>
							<text class="name">{{v.name}}</text>
						</view>
					</view>
				</template>
			</view>
		</template>
		
		<template>
			<view :style="{height:`${obj.wh.navHeight+10}px`,width: '100vw'}"></view>
			<template>
				
				<!-- 小丝 -->
				<template v-if="!obj.messages.length">
					<view class="lefthead">
						<image class="head" src="../../static/logo.png" mode="aspectFill"></image>
					</view>
					<view class="xiaosi_chart">
						<view class="title">HI，欢迎来到{{obj.mod.name}}中心！</view>
						<text class="desc">{{obj.mod.desc}}</text>
					</view>
				</template>
				
				<template v-for="(item,index) in obj.messages" :key="i">
					<view class="flex-row ju-between al-flex-start" v-if="item.role=='user'">
						<view class="problem_chart">{{item.content||''}}</view>
						<image class="edit ml20" src="../../static/25.png" mode="widthFix" @click="obj.chatMsg=item.content||''"></image>
					</view>
					<view class="answer_chart flex-column" v-if="item.role=='assistant'">
						<!-- <mp-html :markdown="true" :selectable="true" :scroll-table="true" :content="item.content||''" /> -->
						<zero-markdown-view :markdown="item.content||''"></zero-markdown-view>
						<view class="recommends flex-column" v-if="item.source&&obj.mod.type==3">
							<text>数据来源：</text>
							<!-- 如果是qt 则去掉注释 -->
							<!-- <text class="name mt10" style="text-decoration: underline;" v-for="(v,i) in item.source" :key="i" @click="changeSource(v)">{{i+1}}、{{v.fileName}}</text> -->
							<text class="name mt10" style="text-decoration: underline;" v-for="(v,i) in item.source" :key="i" @click="changeSource(v)">{{i+1}}、{{v}}</text>
						</view>
						<view class="recommends flex-column" v-if="item.recommends">
							<view class="recommendDesc" v-if="obj.mod.type==2">{{obj.mod.recommendDesc}}</view>
							<!--  这里暂时不要展示热门推荐问题 特别要求的（2024年11月19号上午要求的） -->
							<!-- <template v-if="obj.mod.type==1"> -->
							<!--  这里暂时不要展示企业知识库的推荐问题 特别要求的（2024年11月18号下午要求的） -->
							<!-- <template v-if="obj.mod.type!=2">
								<view class="name mt10" v-for="(v,i) in item.recommends" :key="i" @click="changeRecommend(v)">{{v.name}}</view>
							</template> -->
							<template v-if="obj.mod.type==2&&item.recommends.products&&item.recommends.products.length">
								<view class="proitem pd10 flex-row-center mt20" v-for="(v,i) in item.recommends.products" :key="i" @click="changeRecommend(v)">
									<view class="cover mr20"> <image :src="v.imgs.cover" mode="aspectFill"></image> </view>
									<view class="flex-column flex1 mr20">
										<view class="title lineOne m210">{{v.title}}</view>
										<view class="prodesc" v-if="v.price">
											<text class="min_price mr10">¥{{v.price}}</text>
											<text class="minidesc">元/{{v.unit_||''}}</text>
										</view>
									</view>
									<view class="readbtn flex-center">查看</view>
								</view>
							</template>
							<view v-if="obj.mod.type==2" class="w100 flex-center base-color f28 mt30" @click="proxy.$c.go_url('/pages/proSup/proSup')">更多产品</view>
						</view>
					</view>
				</template>
				
				<template v-if="obj.isChartEnd!==0">
					<view class="recommend">
						<view class="flex-row-center ju-between">
							<text class="re-label">猜你想问</text>
							<image v-if="obj.problems.length>0" class="refresh" src="../../static/24.png" mode="aspectFill" @click="refreshProblem"></image>
						</view>
						<view class="problem" v-for="(v,i) in obj.problems" :key="i" @click="sendRecommend(v)">{{v.title}}</view>
						<view v-if="!obj.problems.length" class="nodata">暂无推荐</view>
					</view>
				</template>
			
			</template>
			<view id="bottom_space" :style="{height:`140rpx`,width: '100vw'}"></view>
		</template>
	</view>
</template>

<script setup>
    import { reactive, getCurrentInstance,onMounted,watch } from 'vue'
	import { onLoad,onShow,onUnload,onTabItemTap,onReachBottom,onPullDownRefresh,onPageScroll } from '@dcloudio/uni-app';
	import mpHtml from '@/components/mp-html/components/mp-html/mp-html.vue'
    let { proxy } = getCurrentInstance()
	let obj = reactive({
		wh: proxy.$c.getglobal(),
		mods: [
			// 0普通聊天 1-问题库—通用推荐；2-产品库；3-瑞佳知识库；4-问题库—瑞佳问题库；5-问题库—产品推荐
			{
				name: '问答',
				icon: '20',
				url: '',
				type: 1,
				desc: 'Hi，欢迎来到问答中心。您有任何丝网行业相关的问题都可以问我！',
				chartrecommend: '',
				recommend: '结合用户问题：${用户提问内容}，请向我推荐三条热门问题，请返回知识库中的随机三列，其他均不要，以清晰的 JSON 格式呈现，JSON字段分别为id和name，且内容必须为中文',
				recommendDesc: '关于丝网问题，大家最热门的问题如下：',
			},
			{
				name: '产品',
				icon: '12',
				url: '',
				type: 2,
				desc: 'Hi，欢迎来到产品中心。告诉我你想要的产品规格或是应用场景，我来帮您推荐源头的厂家及最适合的产品！',
				chartrecommend: '',
				recommend: '请在产品库中为我精准推荐与用户提的问题"${用户提问内容}"中规格数值最为贴近的3个丝网产品。筛选时请优先匹配与“提示词”中含有的规格数值相同或最为接近的产品。丝网规格包含：材质、目数、丝径、孔径、宽度、长度、编型等。以综合相似度最高为准则进行推荐;返回结果以清晰的 JSON 格式呈现，JSON字段分别为id、size_id和name，且字段不可缺少。',
				// recommend: '结合用户问题"${用户提问内容}"，精准推荐产品库中任意的3个产品，要求目数，材质，孔径等各不相同，返回结果以清晰的 JSON 格式呈现，JSON字段分别为id、size_id和name，且字段不可缺少',
				recommendDesc: '根据目前的产品清单，帮你推荐如下产品：',
			},
			{
				name: '知企',
				icon: '11',
				url: '',
				type: 3,
				desc: 'Hi，欢迎来到知企中心。您有任何公司财务、人事、行政等综合事务问题都可以问我！',
				// chartrecommend: '如果是从知识库文档里里获取的答案，请务必在末尾给出来源文档，并用“《》”括起来。',//接入了qanything 所以暂时不用该提示词（如果回复gml，这个提示词要加上）
				recommend: '结合用户问题：${用户提问内容}，向我推荐三条基础企业知识库中最为贴近的文档来源链接，以清晰的 JSON 格式呈现，JSON字段分别为id和name'
			},
			// `结合用户问题：${}，${recommend.replace('${}',)}`
			{
				name: '报价',
				icon: '19',
				url: '',
			},
		],
		mod: {name: '咨询中心', url: '', type: 1, desc: 'Hi，欢迎来到咨询中心。您有任何丝网行业相关的问题都可以问我！' },
		chatMsg: '',
		showMod: false,
		proReq: {
			type: 0,
			currentpage: 1,
			pagesize: 3
		},
		problems: [],
		messages: [
			// {
			// 	role: 'assistant',
			// 	content: `\$ (a + b)^n =\\sum_{k=0}^\\binom{n}{k} (a^{n-k}b) \$`
			// }
		],
		recommends: null,
		isChartEnd: -1,//-1初始化 0聊天中 1聊天成功 2聊天失败
		u: null,
		inputBottom: 0,
		safeAreaBottom: 0,
		
		// "以下是各类常见公式的分类及示例，涵盖数学、物理、化学、工程等领域：
		
		// ---
		
		// ### **1. 数学公式**
		// #### **代数**
		// - **一次方程** y = kx +)
		// - **二次方程求根公式**： x ={-b{b^2 - 4ac}}{2a)
		// - **二项式定理** (a + b)^n =sum_{k=0}^binom{n}{k} a^{n-k}b)
		
		// #### **几何**
		// - **圆面积** A = r^)
		// - **勾股定理**：^2 + b^2 = c^2直角三角形）
		// - **球体积**： Vfrac{4}{pi r^3)
		
		// #### **微积分**
		// - **导数定义**： f'(x) =_{h 0frac{f(x+h) - f(x)}{h)
		// - **积分基本定理**：int_a^b f(x)dx = F(b) - F)
		// - **泰勒展开** f(x) =_{n=0}^{f^{(n)}(a)}{n!}(x-a)^)
		
		// #### **概率统计**
		// - **期望值** E(X) = x_i P(x_i))
		// - **正态分布**：(x)frac{{2frac{(mu)^2}{^2)
		// - **贝叶斯定理** P(A|B){P(B|A)P(A)}{P(B)})
		
		// ---
		
		// ### **2. 物理公式**
		// #### **力学**
		// - **牛顿第二定律**： = ma)
		// - **万有引力**： = Gfrac{m_1 m_2}{r^2})
		// - **动能公式**：_k ={1}{2}mv^2)
		
		// #### **电磁学**
		// - **库仑定律**： F = k_efrac{q_1 q_2}{r^2})
		// - **欧姆定律** V =)
		// - **麦克斯韦方程（积分形式）**：  
		//  nabla{E}epsilon_0})
		
		// #### **热力学**
		// - **理想气体状态方程** PV = nRT)
		// - **热力学第一定律**：Delta U = Q - W)
		// - **熵变公式**Delta Sfrac{dQ}{T})
		
		// ---
		
		// ### **3. 化学公式**
		// #### **化学反应**
		// - **化学平衡常数**：_c =frac{[C]^c [D]^d}{[A]^a [B]^b})
		// - **阿伦尼乌斯方程**： = Afrac{E_a}{RT}})
		
		// #### **溶液化学**
		// - **pH计算**{pH} =[H^+])
		// - **能斯特方程**： = E^0 -{RT}{nF} Q)
		
		// ---
		
		// ### **4. 工程公式**
		// #### **机械工程**
		// - **应力公式**：sigma ={F}{A})
		// - **伯努利方程**：frac{1}{rho v^2rho ghtext{常数})
		
		// #### **电气工程**
		// - **功率公式** P =)
		// - **电感储能** W =frac{1}{2}LI^2)
		
		// ---
		
		// ### **5. 经济学公式**
		// - **复利公式**： = P(1frac{r}{n)^{nt)
		// - **GDP计算**：text{GDP} = C + I + G + (X - M))
		
		// ---
		
		// ### **6. 计算机科学**
		// - **信息熵（香农公式）**：(X) = p(xlog p(x))
		// - **欧拉路径**：图论中满足text{deg}(v)为偶数的条件。
		
		// ---
		
		// ### **7. 生物学公式**
		// - **哈迪-温伯格平衡**： p^2 + 2pq + q^2 = )
		// - **指数增长模型** N(t) = N_0 e^{rt)
		
		// ---
		
		// ### **8. 其他领域**
		// - **相对论质能方程**（爱因斯坦）： = mc^2)
		// - **德布罗意波长**：lambda ={h}{p})
		
		// ---
		
		// 以上公式仅为各领域代表性示例，实际应用中可能涉及更复杂的变体或组合。如果需要特定方向的详细公式，可进一步说明！"
	})
	
	onMounted(()=>{
		login()
		obj.mod = obj.mods[0]
		getproblem()
	})
	
	watch(
		()=>obj.u,
		(val,old)=>{
			if(val&&[-1,2].includes(val.verify)&&JSON.stringify(old)!=JSON.stringify(val)){
				uni.showModal({
					title: '温馨提示',
					content: val.verify==2?`您提交的身份认证的申请被拒绝，是否重新去申请？`:'您的身份还未认证，是否去申请？',
					success: (res)=>{
						if(res.confirm){
							proxy.$c.go_url('/pages/authentication');
						}
					}
				});
			}
		},{deep:true}
	)
	
	onLoad(async(opt)=>{
		obj.u = await getuser()
		if(opt.chatMsg){
			setchart({title:opt.chatMsg},'chart')
		}
		if(opt.chat_id){
			getHistory(opt.chat_id)
		}
		// #ifdef MP-WEIXIN
		uni.onKeyboardHeightChange(res => {
			obj.showMod = false
			obj.inputBottom = res.height
		})
		// #endif
		uni.getSystemInfo({
			success:(res)=>{
				obj.safeAreaBottom = res.safeAreaInsets.bottom
			}
		});
	})
	
	onShow(async()=>{
		obj.u = await getuser()
	})
	
	const login=()=>{
		if(proxy.$c.getOpenid()){
			proxy.$reQuest.post('mp/login',{openid:proxy.$c.getOpenid()},{token: false},).then(async(res)=>{
				if(res.success){
					proxy.$c.setToken(res.msg.token);
					let user_ = proxy.$c.getUser()?JSON.parse(proxy.$c.getUser()):{};
					const user = {
						...user_,
						...res.msg,
					}
					proxy.$c.setUser(JSON.stringify(user));
					obj.u = await getuser()
				}
			}).catch(err=>{})	
		}
	}
	
	const getuser=()=>{
		return new Promise((resovle,rej)=>{
			proxy.$reQuest.post('mp/user/get',{},{token: true,noOut:true},).then(d=>{
				let msg = d.msg||{}
				msg = {
					...msg,
					verify: 1,
					company_id: 1
				}
				resovle(msg)
			}).catch(err=>{resovle({})})
		})
	}
	
	const getHistory=(chat_id)=>{
		proxy.$reQuest.post('mp/user/chat/get',{chat_id:chat_id},{token: true},).then(res=>{
			if(res.success){
				let msg = res.msg||{}
				obj.mod = obj.mods.find(e=>e.type===msg.type)
				obj.messages = res.msg.messages||[]
				obj.messages.map(e=>{
					if(e.recommends&&e.recommends.products&&e.recommends.products.length){
						e.recommends.products.map(ov=>{
							ov.price = ''
							if(ov.preferential&&ov.preferential.length){
								const o1 = ov.preferential.find(mv=>mv.unit=='平方米')
								const o2 = ov.preferential.find(mv=>mv.unit=='米')
								const o3 = ov.preferential.find(mv=>mv.unit=='张')
								const o4 = ov.preferential.find(mv=>mv.unit=='卷')
								ov.price = o1 ? o1.special_price : (o2 ? o2.special_price : (o3 ? o3.special_price : (o4 ? o4.special_price : '')))
								ov.unit_ = o1 ? `平方米` : (o2 ? `米` : (o3 ? `张` : (o4 ? `卷` : '')))
							}
						})
					}
				})
				setTimeout(()=>{
					uni.pageScrollTo({selector: '#bottom_space'})
				}, 30);
			}
		}).catch(err=>{uni.hideLoading()})
	}
	
	const selectMod=(v)=>{
		obj.showMod = false
		if(v.url){
			proxy.$c.go_url(v.url)
		}else if(v.name=='报价'){
			uni.showToast({title: '功能开发中！',icon: 'none'})
		}else{
			if(obj.mod.name==v.name){
				return
			}
			if(v.type!==3||(v.type==3&&obj.u&&obj.u.company_id==1)){
				obj.messages = []
				obj.mod = v
				obj.proReq.type = v.type==1?0:(v.type==2?1:2)
				obj.proReq.currentpage = 1
				getproblem()
			}else{
				if(v.type==3&&obj.u){
					if(obj.u.type_user==1){
						uni.showToast({title: '您还不是企业身份！',icon: 'none'})
					}else if(obj.u.company_id>1){
						uni.showToast({title: '该功能暂未向您的企业开放！',icon: 'none'})
					}else{
						if(obj.u.type_user){
							uni.showToast({title: '该功能暂未开放！',icon: 'none'})
						}else{
							uni.showToast({title: '请先申企请业身份！',icon: 'none'})
						}
					}
				}
			}
		}
	}
	
	const showMod=()=>{
		if(obj.isChartEnd==0){
			return
		}
		obj.showMod=!obj.showMod
	}
	
	const getproblem=()=>{
		proxy.$reQuest.post('mp/problem/list',obj.proReq,{token: true,noOut:true},).then(res=>{
			if(res.success){
				obj.problems = res.msg.list||[]
				obj.proCount = res.msg.count||0
			}else{
				obj.problems = []
			}
		}).catch(err=>{obj.problems = []})
	}
	
	const refreshProblem=()=>{
		if(obj.proCount>obj.proReq.currentpage*obj.proReq.pagesize){
			obj.proReq.currentpage++
		}else{
			obj.proReq.currentpage = 1
		}
		getproblem()
	}
	
	const getproduct=(product_id)=>{
		return new Promise((resovle,rej)=>{
			proxy.$reQuest.post('mp/product/get',{product_id:product_id},{token: true},).then(d=>{
				if(d.success){
					resovle({
						...d.msg||{},
						product_id: product_id,
						id: product_id
					})	
				}else{resovle(null)}
			}).catch(err=>{resovle(null)})
		})
	}
	
	
	const getChartObj_java=async(question,recommend)=>{
		return new Promise((resolve, reject) => {
		    uni.request({
				url: 'https://silkscreen.server.zhhost.top/mp/chat',//后端java调用
		        method: "POST", // 你的请求方法
		        data: {
                    key: question,
                    // key: recommend.replace('${用户提问内容}',question),
                    history: '',
					// messages:JSON.stringify([{
					// 	"role": "user",
					// 	"content": recommend.replace('${用户提问内容}',question)
					// }]),
					type: obj.mod.type==2?5:(obj.mod.type==3?4:1),
					json: false
				},
		        header: {
		            "Content-Type": "application/json;charset=UTF-8;",
		    		"token": proxy.$c.getToken()
		        },
		    	dataType: 'json',
		        enableChunked: false, // 开启流传输
		        success: async(res) => {
					console.log('res非流',res);
					if(res.statusCode==200){
						if(res.data&&!res.data.err){
							const str = `[${res.data.slice(0, -1)}]`
							const d = JSON.parse(str)
							let objstr  = ''
							objstr += d.map(t => t.content).join('')
							console.log('objstr',objstr);
							if(objstr.indexOf("```json")!=-1){
								const objstr_ = objstr.match(/(?<=```json)([\s\S]*?)(?=```)/g)
								let arr = JSON.parse(objstr_[0].replace(/\s+/g, ''))||[]
								if(obj.mod.type==2){
									let products = []
									for (let i = 0; i < arr.length; i++) {
										const o = arr[i]
										if(o.id||o.product_id){
											const p = await getproduct(Number(o.id||o.product_id))
											p.price = ''
											if(p.preferential&&p.preferential.length){
												const o1 = p.preferential.find(ev=>ev.unit=='平方米')
												const o2 = p.preferential.find(ev=>ev.unit=='米')
												const o3 = p.preferential.find(ev=>ev.unit=='张')
												const o4 = p.preferential.find(ev=>ev.unit=='卷')
												p.price = o1 ? o1.special_price : (o2 ? o2.special_price : (o3 ? o3.special_price : (o4 ? o4.special_price : '')))
												p.unit_ = o1 ? `平方米` : (o2 ? `米` : (o3 ? `张` : (o4 ? `卷` : '')))
											}
											if(p){
												products.push(p)	
											}
										}								
									}
									resolve({
										products: products||[],
										recommends: arr||[]
									})
								}else{
									resolve(arr)
								}
							}else{
								resolve(-1)
							}
						}else{
							if(res.data.err&&res.data.err.indexOf('token')!=-1){
								uni.showToast({title: '登录已失效!',icon:'none'})
								setTimeout(()=>{
									proxy.$c.clearToken('token');
									proxy.$c.clearUser('user');
									uni.reLaunch({url: '/pages/login'});
								},1000)
							}
							resolve(-1)
						}
					}else{
						if(res.data.err&&res.data.err.indexOf('token')!=-1){
							uni.showToast({title: '登录已失效!',icon:'none'})
							setTimeout(()=>{
								proxy.$c.clearToken('token');
								proxy.$c.clearUser('user');
								uni.reLaunch({url: '/pages/login'});
							},1000)
						}
						resolve(-1)
					}
		        },
		        fail: (err) => {
		            resolve(-1)
		        },
		    })
		})
	}
	
	const StreamRequest_lava=async(messages,type)=>{
		let messages_ = messages.filter(e=>!e.iserr)
		let m = []
		console.log('messages_',messages_);
        let key = ''
		messages_.map((e,i)=>{
			if(e.recommends){
				delete e.recommends
			}
			if(e.source){
				delete e.source
			}
			if(i==messages_.length-1){
                key = e.content||''
				// m.push(e)//最新提问放最后
				// m.unshift(e)//最新提问放第一
			}else{
				m.push(e)
			}
		})
	    return new Promise((resolve, reject) => {
	        const response = uni.request({
				url: 'https://silkscreen.server.zhhost.top/mp/chat',//后端java调用
	            method: "POST", // 你的请求方法
	            data: {
                    key: key,
                    history: '',
                    // history: m&&m.length ? (JSON.stringify(type==0?m.slice(-10):m.slice(-10))) : '',
					// messages: JSON.stringify(type==0?m.slice(-5):m.slice(-5)),
					type: obj.mod.type==1?0:obj.mod.type,
					json: false
				},
	            header: {
	                "Content-Type": "application/json;charset=UTF-8;",
					"token": proxy.$c.getToken()
	            },
				dataType: 'json',
	            enableChunked: true, // 开启流传输
	            success: async(res) => {
					//调用结束
					console.log('obj.messages',obj.messages);
					console.log('res流',res,isNaN(res.statusCode));
					let len = obj.messages.length-1
					if(res.statusCode==200||isNaN(res.statusCode)){
						if(obj.messages[len].content=='生成中...'){
							obj.isChartEnd = 2
							obj.messages[len].content = `生成失败，请稍后再试...`
							obj.messages[len].iserr = true
							obj.messages[len-1].iserr = true
							return
						}
						obj.isChartEnd = 1
						addchat()
						setTimeout(()=>{
							uni.pageScrollTo({selector: '#bottom_space'})
						}, 10);
					}else{
						obj.isChartEnd = 2
						obj.messages[len].content = `生成失败，失败码${res.statusCode}，请稍后再试...`
						obj.messages[len].iserr = true
						obj.messages[len-1].iserr = true
					}
	            },
	            fail: (err) => {
					obj.isChartEnd = 2
					obj.messages[len].content = '生成失败，请稍后再试...'
					obj.messages[len].iserr = true
					obj.messages[len-1].iserr = true
	            },
	        })
	        // 返回请求的响应
	        resolve(response)
	    })
	}
	
	const ab2strEfficient=(buf)=>{  
		  return Array.from(new Uint8Array(buf), byte => String.fromCharCode(byte)).join('');  
	}
	
	
	const uniqueByMap=(arr, key)=>{
		const map = new Map();
		return arr.filter(item => !map.has(item[key]) && map.set(item[key], true));
	}
	
	const getchat=async(messages,type)=>{
		try {
			const requestTask = await StreamRequest_lava(messages,type)
			// 成功回调 返回流传输信息 返回arrayBuffer
			let local_content = ''
			requestTask.onChunkReceived((e)=>{
				const chunkText_ = ab2strEfficient(e.data)
				const chunkText = decodeURIComponent(escape(chunkText_));
				console.log('chunkText',chunkText);
				// 后端pyrhon调用处理
				const str = `[${chunkText.slice(0, -1)}]`
				const d = JSON.parse(str)
				const c = obj.messages[obj.messages.length-1].content||''
				obj.messages[obj.messages.length-1].content = c=='生成中...'?'':c
				d.map(async(t) => {
					if(t.source&&t.source.length){
						console.log('source',obj.mod.type,t);
						if(obj.mod.type==3){
							local_content = ''
							const len = obj.messages.length-1
							// 如果是之前的qt 记得把注释去掉
							// let source = t.source.filter(e=>e.fileId.indexOf('websearch')==-1)
							// let source_ = uniqueByMap(source,'fileId')
							// obj.messages[len].source = source_&&source_.length?source_:null
							
							obj.messages[len].source = t.source
							setTimeout(()=>{
								uni.pageScrollTo({selector: '#bottom_space'})
							}, 10);	
						}else if(obj.mod.type==2){
							let products = []
							let arr = (t.source||[]).slice(0,3)
							for (let i = 0; i < arr.length; i++) {
								const o = typeof arr[i]=='string' ? JSON.parse(arr[i]) : {}
								if(o.id||o.product_id){
									const p = await getproduct(Number(o.id||o.product_id))
									p.price = ''
									if(p.preferential&&p.preferential.length){
										const o1 = p.preferential.find(ev=>ev.unit=='平方米')
										const o2 = p.preferential.find(ev=>ev.unit=='米')
										const o3 = p.preferential.find(ev=>ev.unit=='张')
										const o4 = p.preferential.find(ev=>ev.unit=='卷')
										p.price = o1 ? o1.special_price : (o2 ? o2.special_price : (o3 ? o3.special_price : (o4 ? o4.special_price : '')))
										p.unit_ = o1 ? `平方米` : (o2 ? `米` : (o3 ? `张` : (o4 ? `卷` : '')))
									}
									if(p){
										products.push(p)	
									}
								}								
							}
							const len = obj.messages.length-1
							obj.messages[len].recommends = {
								products: products||[],
								recommends: arr||[]
							}
						}
					}else{
						obj.messages[obj.messages.length-1].content += t.content||''	
					}
				}).join('')
				setTimeout(()=>{
					uni.pageScrollTo({selector: '#bottom_space'})
				}, 10);
			})
		} catch (err) {
			const len = obj.messages.length-1
			obj.messages[len].content = '生成失败，请稍后再试...'
			obj.messages[len].iserr = true
			obj.messages[len-1].iserr = true
		}
	}
	
	const setchart=async(msg,type)=>{
		type = 'recommend'//暂时设置为 输入框和推荐问题都 启用推荐
		obj.recommends = null
		obj.u = await getuser()
		if([0,1].includes(obj.u.verify)){
			obj.isChartEnd = 0
			const u = {
				"role": "user",
				"content": msg.title
			}
			const chart_u = {
				"role": "user",
				"content": msg.title + (obj.mod.chartrecommend?`（${obj.mod.chartrecommend}）`:'')
			}
			const messages = obj.messages.concat([u])
			const messages_ = obj.messages.concat([chart_u])
			getchat(JSON.parse(JSON.stringify(messages_)),type)
			obj.messages = messages.concat([{
				role: 'assistant',
				content: '生成中...',
				recommends: null//灰色区域 推荐内容
			}])
			setTimeout(()=>{
				uni.pageScrollTo({selector: '#bottom_space'})
			}, 10);
		}else{
			proxy.$c.go_url('/pages/authentication');
		}
	}
	
	const sendRecommend=async(v)=>{
		setchart(v,'recommend')
	}
	
	const sendInut=(msg)=>{
		setchart({title:msg},'chart')
		obj.chatMsg = ''
	}
	
	const changeRecommend=(v)=>{
		if(obj.isChartEnd==0){
			return
		}
		if(obj.mod.type==1){
			sendInut(v.name)
		}else if(obj.mod.type==2){
			proxy.$c.go_url(`/pages/productDetail?id=${v.id}`)
		}else if(obj.mod.type==3){
			sendInut(v.name)
		}
	}
	
	const changeSource=(v)=>{
		if(v.toLowerCase().indexOf('.pdf')!=-1){
			proxy.$c.go_url(`/pages/onlineWeb?fileName=${v}`)
		}if(v.toLowerCase().indexOf('.jpg')!=-1||v.toLowerCase().indexOf('.png')!=-1||v.toLowerCase().indexOf('.jpeg')!=-1){
			proxy.$c.previewImage(`https://silkscreen.file.zhhost.top/knowledge/${v}`)
		}else{
			proxy.$c.previewFile(`https://silkscreen.file.zhhost.top/knowledge/${v}`)
		}
		
		//如果换成qt 则去掉如下注释
		// proxy.$reQuest.post('mp/getFile',{document_id:v.fileId},{token: true},).then(res=>{
		// 	if(res.success&&res.msg){
		// 		if(res.msg.toLowerCase().indexOf('.pdf')!=-1){
		// 			proxy.$c.go_url(`/pages/onlineWeb?fileId=${v.fileId}&fileName=${res.msg}`)
		// 		}if(res.msg.toLowerCase().indexOf('.jpg')!=-1||res.msg.toLowerCase().indexOf('.png')!=-1||res.msg.toLowerCase().indexOf('.jpeg')!=-1){
		// 			proxy.$c.previewImage(`https://silkscreen.file.zhhost.top/knowledge/${res.msg}`)
		// 		}else{
		// 			proxy.$c.previewFile(`https://silkscreen.file.zhhost.top/knowledge/${res.msg}`)
		// 		}
		// 	}else{
		// 		uni.showToast({title: '文件打开失败！',icon: 'none'})
		// 	}
		// }).catch(err=>{uni.showToast({title: '文件打开失败！',icon: 'none'})})
	}
	
	const getLastArrs=(arr,len)=>{  
	  // 计算开始索引，如果数组长度小于5，则开始索引为0  
	  const startIndex = Math.max(arr.length - len, 0);  
	  // 使用slice方法截取数组  
	  return arr.slice(startIndex);  
	} 
	
	const addchat=()=>{
		let messages = obj.messages.filter(e=>!e.iserr)
		if(messages.length){
			const ms = getLastArrs(messages,10)
			proxy.$reQuest.post('mp/user/chat/add',{
				messages: JSON.stringify(ms),
				other: '',
				type: obj.mod.type
			},{token: true},).then(res=>{
				if(res.success){
					obj.companys = res.msg.list||[]
				}else{
					obj.companys = []
				}
			}).catch(err=>{obj.companys = []})
		}
	}
	
	
</script>

<style lang="scss" scoped>
	.pagebox{
		width: 750rpx;min-height: 100vh;padding: 0 30rpx;box-sizing: border-box;font-size: 28rpx;overflow: hidden;
		.bg{
			position: fixed;left: 0;top: 0;z-index: -1;
			width: 750rpx;height: 430rpx;
			background: linear-gradient( 180deg, #BCE5F7 0%, #fff 100%);
		}
		.bottombox{
			position: fixed;left: 0;bottom: 0; z-index: 9999999;background: #fff;box-shadow: 0 -10rpx 10rpx 10rpx rgba(0,0,0,0.03);
			// padding: 20rpx 30rpx 20rpx;
			padding-left: 30rpx;padding-right: 30rpx;padding-top: 20rpx;
			box-sizing: border-box;
			.chartbox{
				width: 690rpx;
				.voicebox{
					width: 80rpx;min-width: 80rpx;height: 80rpx;border: 2rpx solid #D9DBE4;border-radius: 76rpx;margin-right: 20rpx;
					.voiceicon{width: 50rpx;height: 50rpx;}
				}
				.inputbox{
					flex: 1;min-height: 80rpx;border-radius: 40rpx;border: 2rpx solid #D9DBE5;
					padding: 10rpx 0 10rpx 30rpx;box-sizing: border-box;font-size: 28rpx;overflow: hidden;
					input{flex: 1;}
					textarea{flex: 1;}
					
					.addiconbox{
						width: 80rpx;height: 60rpx;
						.addicon{width: 40rpx;height: 40rpx;}
					}
				}
				.send{height: 80rpx;border-radius: 80rpx;padding: 0 30rpx;box-sizing: border-box; margin-left: 10rpx;background: #1773E5;display: flex;align-items: center;justify-content: center;font-size: 28rpx;color: #fff;}
			}
			.desc{width: 100%;font-size: 22rpx;color: #999;text-align: right;margin-bottom: 20rpx;margin-top: 10rpx;}
			.modbox{
				.mod{
					width: 25%;margin-bottom: 30rpx;
					.item{
						width: 120rpx;height: 118rpx;background: #FFFFFF;box-shadow: 0rpx 5rpx 13rpx 0rpx #EDEDED;border-radius: 20rpx;margin-bottom: 20rpx;
						image{width: 42rpx;height: 42rpx;}
					}
					.name{font-size: 30rpx;}
				}
			}
		}
		.inputBottom{
			// padding: 20rpx 30rpx constant(safe-area-inset-bottom);/* 兼容 iOS < 11.2 */
			// padding: 20rpx 30rpx env( safe-area-inset-bottom);/* 兼容 iOS < 11.2 */
		}
		
		.lefthead{
			width: 60rpx;height: 60rpx;border-radius: 60rpx;overflow: hidden;margin-bottom: 10rpx;image{width: 60rpx;height: 60rpx;}
		}
		.xiaosi_chart{
			width: 690rpx;height: auto;box-shadow: 0rpx 2rpx 7rpx 0rpx rgba(170,192,224,0.5);border-radius: 0rpx 25rpx 25rpx 25rpx;border: 2rpx solid rgba(255,255,255,0.3);
			padding: 20rpx 30rpx;box-sizing: border-box;margin-bottom: 40rpx;
			background: linear-gradient( 86deg, #E2EEFF 0%, #EAECFF 100%);
			.title{font-size: 33rpx;font-weight: bold;color: #5289E8;margin-bottom: 5rpx;}
			.desc{font-size: 25rpx;color: #999;}
		}
		.recommend{
			position: relative;
			width: 690rpx;height: auto;background: #FFFFFF;box-shadow: 0rpx 4rpx 16rpx 0rpx #DAE3EF;border-radius: 0rpx 25rpx 25rpx 25rpx;
			padding: 20rpx 30rpx;box-sizing: border-box;margin-bottom: 40rpx;
			.re-label{font-size: 32rpx;font-weight: bold;position: relative;z-index: 2;}
			.re-label::before{content: '';display: block;position: absolute;left: 0;bottom: 10rpx;z-index: 1;width: 114rpx;height: 11rpx;background: linear-gradient( 90deg, #3D8BFF 0%, rgba(251,251,251,0) 100%);opacity: 0.75;}
			.refresh{width: 30rpx;height: 30rpx;}
			.problem{padding: 30rpx 0;box-sizing: border-box;font-size: 30rpx;border-bottom: 1rpx solid #F3F3F3;}
			.problem:last-child{border: none;}
			.nodata{width: 100%;padding: 60rpx;box-sizing: border-box;text-align: center;font-size: 22rpx;color: #999;}
		}
		
		.problem_chart{
			width: fit-content;max-width: 690rpx;height: auto;display: inline-flex;background: #1773E5;border-radius: 0rpx 18rpx 18rpx 18rpx;color: #fff;
			padding: 20rpx 30rpx;box-sizing: border-box;margin-bottom: 40rpx;
		}
		.edit{width: 30rpx;}
		.answer_chart{
			width: auto;max-width: 690rpx;height: auto;display: inline-flex;background: linear-gradient( 82deg, #F5F6F8 0%, #F5F6F8 100%);box-shadow: 0rpx 0rpx 9rpx 0rpx #EDF0F5;border-radius: 0rpx 25rpx 25rpx 25rpx;border: 1rpx solid #E1E8F8;
			padding: 20rpx;box-sizing: border-box;margin-bottom: 40rpx;
			.recommends{
				// padding: 20rpx;box-sizing: border-box;background: #ECEDF0;
				border-radius: 10rpx;margin-bottom: 10rpx;
				font-size: 28rpx;
				.recommendDesc{
					color: #999;margin-bottom: 10rpx;
				}
				.name{
					color: #1773E5;
				}
				.proitem{
					background: #fff;border-radius: 10rpx;
					.cover{
						width: 120rpx;height: 120rpx;border-radius: 10rpx;overflow: hidden;background: #f9f9f9;
						image{width: 120rpx;height: 120rpx;}
					}
					.title{font-size: 30rpx;font-weight: bold;margin-bottom: 10rpx;}
					.prodesc{font-size: 24rpx;color: #999;}
					.minidesc{font-size: 22rpx;color: #999;}
					.min_price{font-size: 36rpx;font-weight: bold;color: red;}
					.readbtn{
						width: 108rpx;height: 46rpx;background: #e5f1ff;border-radius: 12rpx;font-size: 22rpx;color: #1773E5;
					}
				}
			}
			.desc{width: 100%;text-align: right;font-size: 22rpx;color: #999;}
		}
	}
</style>
